%% 单圆标准刺激(圆半径相等)，添加颜色通道和对比度增强的背景色，按颜色保存到不同文件夹
% circle_radius = 6;
% radistmp > 3*circle_radius;（因为只距离两个半径太近了，几乎黏在一起了）
% number_sets = 2:2:30
% 增加50种颜色通道，每类20张图片，背景为色系相似但差值>100的颜色

clear; sca
[xax, yax] = meshgrid(1:224, 1:224);
rax = xax+1i*yax;

%% 设置图片数和颜色数
number_sets = [1, 2:2:30]; % 增加1为第一类，然后保持原有的2、4、6...30
image_iter = 20; % 每类数量要生成20张图 (原来是10张)
color_num = 50; % 颜色种类数量

% 半径
circle_radius = 6;

% 生成50种随机颜色
colors = rand(color_num, 3); % 每行是一种RGB颜色
% 提高颜色值，确保清晰可见
colors = colors * 0.8 + 0.2; % 确保颜色值在0.2到1.0之间

% 创建主输出文件夹
main_output_dir = 'singlecomp_standard_images';
if ~exist(main_output_dir, 'dir')
    mkdir(main_output_dir);
end

% 所有数量保存在image_standard的变量中 (size=224*224*20*15*3*50) - 增加了RGB三通道和颜色维度
single_image_standard = zeros(size(rax, 1), size(rax, 2), 3, image_iter, length(number_sets), color_num); 

% 查找可用的屏幕
screens = Screen('Screens');
screenNumber = max(screens); % 使用主屏幕

for cc = 1:color_num % 对每种颜色循环
    current_color = colors(cc, :); % 当前颜色
    
    % 使用HSV色彩空间计算背景颜色 - 保持色相，降低饱和度，增加明度
    hsv_color = rgb2hsv(current_color);  % 转换到HSV颜色空间
    hsv_color(2) = hsv_color(2) * 0.4;   % 降低饱和度到原来的40%
    hsv_color(3) = min(1, hsv_color(3) * 1.8);  % 增加明度，但不超过1
    bg_color = hsv2rgb(hsv_color);  % 转回RGB颜色空间
    
    % 检查颜色差值，确保差值>100 (0-255范围内)
    stim_color_255 = round(current_color * 255);
    bg_color_255 = round(bg_color * 255);
    
    % 计算欧氏距离作为颜色差异度量
    color_diff = sqrt(sum((stim_color_255 - bg_color_255).^2));
    
    % 如果差值不够大，继续调整背景色
    adjustment_attempts = 0;
    while color_diff < 100 && adjustment_attempts < 10
        % 进一步调整HSV值以增加对比度
        if hsv_color(3) < 0.9  % 如果明度还有提升空间
            hsv_color(3) = min(1, hsv_color(3) + 0.1);  % 继续增加明度
        else  % 如果明度已经很高，则降低饱和度
            hsv_color(2) = max(0, hsv_color(2) - 0.1);
        end
        
        bg_color = hsv2rgb(hsv_color);  % 更新背景颜色
        bg_color_255 = round(bg_color * 255);
        color_diff = sqrt(sum((stim_color_255 - bg_color_255).^2));
        adjustment_attempts = adjustment_attempts + 1;
    end
    
    % 如果还是无法满足差值要求，使用一个默认的高对比度背景
    if color_diff < 100
        % 检查颜色亮度
        luminance = 0.2126 * current_color(1) + 0.7152 * current_color(2) + 0.0722 * current_color(3);
        if luminance > 0.5
            bg_color = [0.1, 0.1, 0.1];  % 暗色刺激用深色背景
        else
            bg_color = [0.9, 0.9, 0.9];  % 亮色刺激用浅色背景
        end
        bg_color_255 = round(bg_color * 255);
        color_diff = sqrt(sum((stim_color_255 - bg_color_255).^2));
    end
    
    % 创建当前颜色的文件夹 (使用颜色值作为文件夹名)
    color_folder_name = sprintf('color_%d_%.3f_%.3f_%.3f_diff%.0f', cc, current_color(1), current_color(2), current_color(3), color_diff);
    color_folder_path = fullfile(main_output_dir, color_folder_name);
    if ~exist(color_folder_path, 'dir')
        mkdir(color_folder_path);
    end
    
    for tt = 1:length(number_sets) % 类数量的总数
        nn = number_sets(tt); % 当前类需要生成的单个圆个数

        for ii = 1:image_iter % 每类数生成20张图
            % 直接使用图像处理方式生成图像
            % 创建背景图像 - 使用色系相同但对比度增强的颜色
            img = ones(224, 224, 3);
            for ch = 1:3
                img(:,:,ch) = bg_color(ch);
            end

            % 生成第一个圆的位置
            loc = ceil(circle_radius)+randi(size(rax,2)-2*ceil(circle_radius))...
                +1i*(ceil(circle_radius)+randi(size(rax,1)-2*ceil(circle_radius))); 

            x1 = real(loc); % 圆心的x坐标
            y1 = imag(loc); % 圆心的y坐标
            circle = [x1;y1];

            %% 保存参数
            loctmp = loc;
            x1tmp = x1; % 圆心的x坐标
            y1tmp = y1; % 圆心的y坐标
            circletmp = circle;

            while length(loctmp) < nn  % 要生成nn个圆刺激
                % 生成下一个圆
                loc = ceil(circle_radius)+randi(size(rax,2)-2*ceil(circle_radius))...
                    +1i*(ceil(circle_radius)+randi(size(rax,1)-2*ceil(circle_radius))); %圆位置

                x1 = real(loc); % 圆心的横坐标
                y1 = imag(loc); % 圆心的纵坐标
                circle = [x1;y1];
               
                % 控制圆不重叠
                distancestmp = abs(loc-loctmp); % 当前圆的中点与其他圆的中点距离
                radistmp = (circle_radius*3); % 最小间距是3倍半径
                okToAdd = all(distancestmp>radistmp); 

                if okToAdd
                    % 保存参数
                    loctmp = [loctmp,loc]; % 圆心位置
                    x1tmp = [x1tmp,x1]; % 所有圆的x坐标
                    y1tmp = [y1tmp,y1]; % 所有圆的y坐标
                    circletmp = [circletmp,circle];
                end
            end
            
            % 绘制所有圆点
            for cc_idx = 1:size(circletmp,2)
                img = drawCircle(img, round(circletmp(1,cc_idx)), round(circletmp(2,cc_idx)), circle_radius, current_color);
            end
            
            % 保存图像到数组
            single_image_standard(:,:,:,ii,tt,cc) = img;
            
            % 保存图片到对应颜色的文件夹
            img_filename = sprintf('single_circle_nn%d_img%d.png', nn, ii);
            img_path = fullfile(color_folder_path, img_filename);
            imwrite(img, img_path);
            
            % 显示第一张图像以确认生成正确
            if cc == 1 && tt == 1 && ii == 1
                figure;
                imshow(img);
                title(sprintf('单圆示例图像 - 颜色差值: %.0f', color_diff));
                drawnow;
            end
        end
    end
end

% 保存变量
single_vgg_standard_color = single_image_standard;
save single_vgg_standard_color.mat single_vgg_standard_color -v7.3 % 使用-v7.3格式保存大矩阵

% 自定义画圆函数
function img = drawCircle(img, cx, cy, r, color)
    % 使用中点圆算法绘制实心圆
    [X, Y] = meshgrid(1:size(img, 2), 1:size(img, 1));
    mask = (X - cx).^2 + (Y - cy).^2 <= r^2;
    
    % 对每个颜色通道应用掩码
    for c = 1:3
        channel = img(:, :, c);
        channel(mask) = color(c);
        img(:, :, c) = channel;
    end
end